Types For Functional Programs